package com.cencat.order.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.cencat.order.entity.OrderInfo;
import com.cencat.order.dto.OrderCreateDTO;
import com.cencat.order.dto.OrderQueryDTO;
import com.cencat.order.dto.OrderUpdateDTO;
import com.cencat.order.vo.OrderDetailVO;
import com.cencat.order.vo.OrderStatisticsVO;
import com.cencat.order.vo.OrderVO;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 订单信息服务接口
 * 
 * @author cencat
 * @since 2024-01-20
 */
public interface OrderInfoService extends IService<OrderInfo> {

    /**
     * 创建订单
     * 
     * @param orderCreateDTO 订单创建DTO
     * @return 订单详情
     */
    OrderDetailVO createOrder(OrderCreateDTO orderCreateDTO);

    /**
     * 更新订单
     * 
     * @param orderId 订单ID
     * @param orderUpdateDTO 订单更新DTO
     * @return 是否成功
     */
    boolean updateOrder(Long orderId, OrderUpdateDTO orderUpdateDTO);

    /**
     * 取消订单
     * 
     * @param orderId 订单ID
     * @param cancelReason 取消原因
     * @param operatorId 操作人ID
     * @return 是否成功
     */
    boolean cancelOrder(Long orderId, String cancelReason, Long operatorId);

    /**
     * 确认订单
     * 
     * @param orderId 订单ID
     * @param operatorId 操作人ID
     * @return 是否成功
     */
    boolean confirmOrder(Long orderId, Long operatorId);

    /**
     * 发货
     * 
     * @param orderId 订单ID
     * @param logisticsCompany 物流公司
     * @param logisticsNo 物流单号
     * @param operatorId 操作人ID
     * @return 是否成功
     */
    boolean shipOrder(Long orderId, String logisticsCompany, String logisticsNo, Long operatorId);

    /**
     * 完成订单
     * 
     * @param orderId 订单ID
     * @param operatorId 操作人ID
     * @return 是否成功
     */
    boolean completeOrder(Long orderId, Long operatorId);

    /**
     * 支付订单
     * 
     * @param orderId 订单ID
     * @param paymentMethod 支付方式
     * @param paidAmount 实付金额
     * @param transactionNo 交易流水号
     * @param operatorId 操作人ID
     * @return 是否成功
     */
    boolean payOrder(Long orderId, String paymentMethod, BigDecimal paidAmount, 
                    String transactionNo, Long operatorId);

    /**
     * 退款
     * 
     * @param orderId 订单ID
     * @param refundAmount 退款金额
     * @param refundReason 退款原因
     * @param operatorId 操作人ID
     * @return 是否成功
     */
    boolean refundOrder(Long orderId, BigDecimal refundAmount, String refundReason, Long operatorId);

    /**
     * 分页查询订单列表
     * 
     * @param page 分页参数
     * @param queryDTO 查询条件
     * @return 订单分页列表
     */
    IPage<OrderVO> pageOrders(Page<OrderInfo> page, OrderQueryDTO queryDTO);

    /**
     * 根据订单号查询订单详情
     * 
     * @param orderNo 订单号
     * @return 订单详情
     */
    OrderDetailVO getOrderByOrderNo(String orderNo);

    /**
     * 根据订单ID查询订单详情
     * 
     * @param orderId 订单ID
     * @return 订单详情
     */
    OrderDetailVO getOrderDetail(Long orderId);

    /**
     * 查询用户订单列表
     * 
     * @param userId 用户ID
     * @param orderStatus 订单状态（可选）
     * @param page 分页参数
     * @return 用户订单列表
     */
    IPage<OrderVO> getUserOrders(Long userId, Integer orderStatus, Page<OrderInfo> page);

    /**
     * 查询商家订单列表
     * 
     * @param merchantId 商家ID
     * @param orderStatus 订单状态（可选）
     * @param page 分页参数
     * @return 商家订单列表
     */
    IPage<OrderVO> getMerchantOrders(Long merchantId, Integer orderStatus, Page<OrderInfo> page);

    /**
     * 批量更新订单状态
     * 
     * @param orderIds 订单ID列表
     * @param orderStatus 订单状态
     * @param operatorId 操作人ID
     * @return 是否成功
     */
    boolean batchUpdateOrderStatus(List<Long> orderIds, Integer orderStatus, Long operatorId);

    /**
     * 查询待处理订单列表
     * 
     * @param merchantId 商家ID（可选）
     * @return 待处理订单列表
     */
    List<OrderVO> getPendingOrders(Long merchantId);

    /**
     * 查询已完成订单列表
     * 
     * @param userId 用户ID（可选）
     * @param merchantId 商家ID（可选）
     * @param limit 限制数量
     * @return 已完成订单列表
     */
    List<OrderVO> getCompletedOrders(Long userId, Long merchantId, Integer limit);

    /**
     * 订单统计
     * 
     * @param userId 用户ID（可选）
     * @param merchantId 商家ID（可选）
     * @param startTime 开始时间（可选）
     * @param endTime 结束时间（可选）
     * @return 订单统计信息
     */
    OrderStatisticsVO getOrderStatistics(Long userId, Long merchantId, 
                                         LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 计算订单总金额
     * 
     * @param userId 用户ID（可选）
     * @param merchantId 商家ID（可选）
     * @param orderStatus 订单状态（可选）
     * @param startTime 开始时间（可选）
     * @param endTime 结束时间（可选）
     * @return 总金额
     */
    BigDecimal calculateTotalAmount(Long userId, Long merchantId, Integer orderStatus,
                                   LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 生成订单号
     * 
     * @return 订单号
     */
    String generateOrderNo();

    /**
     * 验证订单状态是否可以变更
     * 
     * @param currentStatus 当前状态
     * @param targetStatus 目标状态
     * @return 是否可以变更
     */
    boolean validateStatusChange(Integer currentStatus, Integer targetStatus);

    /**
     * 检查订单是否属于用户
     * 
     * @param orderId 订单ID
     * @param userId 用户ID
     * @return 是否属于用户
     */
    boolean checkOrderBelongsToUser(Long orderId, Long userId);

    /**
     * 检查订单是否属于商家
     * 
     * @param orderId 订单ID
     * @param merchantId 商家ID
     * @return 是否属于商家
     */
    boolean checkOrderBelongsToMerchant(Long orderId, Long merchantId);

    /**
     * 自动取消超时未支付订单
     * 
     * @param timeoutMinutes 超时分钟数
     * @return 取消的订单数量
     */
    int autoCancelTimeoutOrders(int timeoutMinutes);

    /**
     * 自动确认收货超时订单
     * 
     * @param timeoutDays 超时天数
     * @return 确认的订单数量
     */
    int autoConfirmTimeoutOrders(int timeoutDays);
}